home *** CD-ROM | disk | FTP | other *** search
/ Game Cracker (Expanded Edition) / Game Cracker (Expanded Edition).iso / cracks / SV_URACE.ZIP / Ultim@te Race Pro.txt < prev    next >
Encoding:
Text File  |  1999-05-06  |  15.9 KB  |  361 lines

  1.  
  2. Free Information Xchange '98 presents:
  3.  
  4. Ultim@te Race Pro - CD crack by Static Vengeance
  5.  
  6. Requirements:
  7. Hex editor and full game install
  8. W32Dasm if you wish to follow along
  9.  
  10.     Ultim@te Race Pro (URP) is a great racing sim that really shows off what one of the new VooDoo2
  11. cards can do.  It also supports PowerVR cards in native SGL mode and other 3D cards with Direct3D.  Anyways,
  12. there is one little problem with the game that needs to be FiX'ed and that is the CD check.  When you try
  13. to run the game without the CD up pops a standard Win95 dialog box and it tells you to "Insert the Ultim@te
  14. Race Pro CD-ROM !!!"  Great, no problem we'll just disassemble the game exe with W32Dasm and track down the
  15. string.  Well, when I tried to disassemble the file W32Dasm came up and started, but the code segment had
  16. an offset of 00000000 and a size of 00000000.  So no code listed was generated.  I ended up with this:
  17.  
  18. Disassembly of File: Ultim@te Race Pro.exe
  19. Code Offset = 00000000, Code Size = 00000000  <-- Something is wrong here!
  20. Data Offset = 00106A00, Data Size = 00041600
  21.  
  22. Number of Objects = 0006 (dec), Imagebase = 00400000h
  23.  
  24.    Object01: .text    RVA: 00001000 Offset: 00000400 Size: 00102400 Flags: C0000020  <-- here is a clue
  25.    Object02: .rdata   RVA: 00104000 Offset: 00102800 Size: 00004200 Flags: 40000040
  26.    Object03: .data    RVA: 00109000 Offset: 00106A00 Size: 00041600 Flags: C0000040
  27.    Object04: .idata   RVA: 004EF000 Offset: 00148000 Size: 00001400 Flags: C0000040
  28.    Object05:          RVA: 004F1000 Offset: 00149400 Size: 00001400 Flags: C0000040
  29.    Object06: .rsrc    RVA: 004F3000 Offset: 0014A800 Size: 00001800 Flags: 40000040
  30.  
  31.     Hmmmmmmmm... there must be some type of problem in the internal file link.  So I started comparing
  32. disassembly listings for other programs I had cracked like Powerboat Racing:
  33.  
  34. Disassembly of File: PBoat.exe
  35. Code Offset = 00000400, Code Size = 00097800  <-- Everything seems ok here
  36. Data Offset = 00097C00, Data Size = 0000DC00
  37.  
  38. Number of Objects = 0006 (dec), Imagebase = 00400000h
  39.  
  40.    Object01: BEGTEXT  RVA: 00001000 Offset: 00000400 Size: 00097800 Flags: 60000020  <-- Different values here
  41.    Object02: DGROUP   RVA: 00099000 Offset: 00097C00 Size: 0000DC00 Flags: C0000040
  42.    Object03: .bss     RVA: 000A7000 Offset: 00000000 Size: 00048800 Flags: C0000080
  43.    Object04: .idata   RVA: 000F0000 Offset: 000A5800 Size: 00001000 Flags: C0000040
  44.    Object05: .reloc   RVA: 000F1000 Offset: 000A6800 Size: 00010000 Flags: 42000040
  45.    Object06: .rsrc    RVA: 00101000 Offset: 000B6800 Size: 00001200 Flags: 40000040
  46.  
  47.     The more comparisons I did the more I noticed that the "Flags" for the code section were usually
  48. 60000020 and in URP it was C0000020 and most programs the code had an offset or 400h.  So I got HEdit up and
  49. running and looked at the first section of the URP file.  Then I compared it's structure against other games
  50. that I had cracked.  Seeing the general pattern, the only real difference seemed to be the Flag value of
  51. C0000020.  So I renamed the URP exe file and copied another copy to the directory I was working in.  Then
  52. I editted the renamed copy to change the Flags value to 60000020.  At offset 412 I changed the 20 to a 40
  53. and at 415 I changed the C0 to 60.  Then I tried to disassmble it again with W32Dasm and it worked!  I was
  54. rewarded with a disassmbled listing of Ultim@te Race Pro that I could start poking around in.  So now it's
  55. back to the normal routine of going up to the menu bar and selecting "Refs" and then select "String data
  56. references" from the drop down menu.  Now, in the pop up reference box scroll down until you see the string
  57. "Insert the Ultim@te Race Pro CD-ROM" double click on it and W32Dasm will put you in the middle of the CD
  58. checking routine that looks like this:
  59.  
  60. * Referenced by a CALL at Address:
  61. |:00493BEF                                              <-- Where it was called from
  62. |
  63. :00493DE0 81EC00020000            sub esp, 00000200
  64.  
  65. * Possible StringData Ref from Data Obj ->"CD_NEEDED"
  66.                                   |
  67. :00493DE6 B964575300              mov ecx, 00535764
  68. :00493DEB E8D0F10000              call 004A2FC0
  69. :00493DF0 85C0                    test eax, eax
  70. :00493DF2 0F84D0000000            je 00493EC8
  71. :00493DF8 8D8C2400010000          lea ecx, dword ptr [esp+00000100]
  72. :00493DFF E88CFDFFFF              call 00493B90
  73. :00493E04 8D842400010000          lea eax, dword ptr [esp+00000100]
  74.  
  75. * Possible StringData Ref from Data Obj ->"French"            <-- Various languages supported
  76.                                   |
  77. :00493E0B 6864125200              push 00521264
  78. :00493E10 50                      push eax
  79. :00493E11 E82A390600              call 004F7740
  80. :00493E16 83C408                  add esp, 00000008
  81. :00493E19 85C0                    test eax, eax
  82. :00493E1B 750A                    jne 00493E27
  83.  
  84. * Possible StringData Ref from Data Obj ->"Ins"
  85.                                   |
  86. :00493E1D 6890585300              push 00535890
  87. :00493E22 E994000000              jmp 00493EBB
  88.  
  89. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  90. |:00493E1B(C)
  91. |
  92. :00493E27 8D942400010000          lea edx, dword ptr [esp+00000100]
  93.  
  94. * Possible StringData Ref from Data Obj ->"Spanish"
  95.                                   |
  96. :00493E2E 6844125200              push 00521244
  97. :00493E33 52                      push edx
  98. :00493E34 E807390600              call 004F7740
  99. :00493E39 83C408                  add esp, 00000008
  100. :00493E3C 85C0                    test eax, eax
  101. :00493E3E 750C                    jne 00493E4C
  102. :00493E40 8D442400                lea eax, dword ptr [esp]
  103. :00493E44 6864585300              push 00535864
  104. :00493E49 50                      push eax
  105. :00493E4A EB74                    jmp 00493EC0
  106.  
  107. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  108. |:00493E3E(C)
  109. |
  110. :00493E4C 8D8C2400010000          lea ecx, dword ptr [esp+00000100]
  111.  
  112. * Possible StringData Ref from Data Obj ->"German"
  113.                                   |
  114. :00493E53 6854125200              push 00521254
  115. :00493E58 51                      push ecx
  116. :00493E59 E8E2380600              call 004F7740
  117. :00493E5E 83C408                  add esp, 00000008
  118. :00493E61 85C0                    test eax, eax
  119. :00493E63 750C                    jne 00493E71
  120. :00493E65 8D542400                lea edx, dword ptr [esp]
  121.  
  122. * Possible StringData Ref from Data Obj ->"Legen Sie die Ultim@te Race Pro-CD!!!"  <-- Say it in German
  123.                                   |
  124. :00493E69 683C585300              push 0053583C
  125. :00493E6E 52                      push edx
  126. :00493E6F EB4F                    jmp 00493EC0
  127.  
  128. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  129. |:00493E63(C)
  130. |
  131. :00493E71 8D842400010000          lea eax, dword ptr [esp+00000100]
  132.  
  133. * Possible StringData Ref from Data Obj ->"Italian"
  134.                                   |
  135. :00493E78 6834585300              push 00535834
  136. :00493E7D 50                      push eax
  137. :00493E7E E8BD380600              call 004F7740
  138. :00493E83 83C408                  add esp, 00000008
  139. :00493E86 85C0                    test eax, eax
  140. :00493E88 7507                    jne 00493E91
  141.  
  142. * Possible StringData Ref from Data Obj ->"Inserire il CD Ultim@te Race Pro "  <-- Say it in Italian
  143.                                         ->"!!!"
  144.                                   |
  145. :00493E8A 680C585300              push 0053580C
  146. :00493E8F EB2A                    jmp 00493EBB
  147.  
  148. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  149. |:00493E88(C)
  150. |
  151. :00493E91 8D942400010000          lea edx, dword ptr [esp+00000100]
  152.  
  153. * Possible StringData Ref from Data Obj ->"Portuguese"
  154.                                   |
  155. :00493E98 6838125200              push 00521238
  156. :00493E9D 52                      push edx
  157. :00493E9E E89D380600              call 004F7740
  158. :00493EA3 83C408                  add esp, 00000008
  159. :00493EA6 85C0                    test eax, eax
  160. :00493EA8 750C                    jne 00493EB6
  161. :00493EAA 8D442400                lea eax, dword ptr [esp]
  162.  
  163. * Possible StringData Ref from Data Obj ->"Coloque o CD de Ultim@te Race "  <-- Say it in Portuguese?!?
  164.                                         ->"Pro !!!"
  165.                                   |
  166. :00493EAE 68E4575300              push 005357E4
  167. :00493EB3 50                      push eax
  168. :00493EB4 EB0A                    jmp 00493EC0
  169.  
  170. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  171. |:00493EA8(C)
  172. |
  173. * Possible StringData Ref from Data Obj ->"Insert the Ultim@te Race Pro CD-ROM "  <-- The string that got us
  174.                                         ->"!!!"                                   <-- here in the first place
  175.                                   |
  176. :00493EB6 68BC575300              push 005357BC
  177.  
  178. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  179. |:00493E22(U), :00493E8F(U)
  180. |
  181. :00493EBB 8D4C2404                lea ecx, dword ptr [esp+04]
  182. :00493EBF 51                      push ecx
  183.  
  184. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  185. |:00493E4A(U), :00493E6F(U), :00493EB4(U)
  186. |
  187. :00493EC0 E88BF30500              call 004F3250
  188. :00493EC5 83C408                  add esp, 00000008
  189.  
  190. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  191. |:00493DF2(C)
  192. |
  193. :00493EC8 A1500D8E00              mov eax, dword ptr [008E0D50]
  194. :00493ECD 6835200000              push 00002035
  195. :00493ED2 8D542404                lea edx, dword ptr [esp+04]
  196.  
  197. * Possible StringData Ref from Data Obj ->"Ultim@te Race Pro Message"
  198.                                   |
  199. :00493ED6 68147A5200              push 00527A14
  200. :00493EDB 52                      push edx
  201. :00493EDC 50                      push eax
  202.  
  203. * Reference To: USER32.MessageBoxA, Ord:0195h
  204.                                   |
  205. :00493EDD FF15E8F58E00            Call dword ptr [008EF5E8]
  206. :00493EE3 83F802                  cmp eax, 00000002                 <-- 02 means you hit cancel
  207. :00493EE6 7507                    jne 00493EEF
  208. :00493EE8 33C9                    xor ecx, ecx
  209. :00493EEA E8F14E0300              call 004C8DE0
  210.  
  211. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  212. |:00493EE6(C)
  213. |
  214. :00493EEF E81CDE0300              call 004D1D10
  215. :00493EF4 81C400020000            add esp, 00000200
  216. :00493EFA C3                      ret
  217.  
  218.     Alright now lets back trace the program a little and check out the routine that called the above
  219. code to see what it does:
  220.  
  221. * Referenced by a CALL at Addresses:
  222. |:00493C65   , :00493CB8                             <-- Called twice!
  223. |
  224. :00493BC0 56                      push esi
  225. :00493BC1 8BF1                    mov esi, ecx
  226.  
  227. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  228. |:00493BF4(U)
  229. |
  230. * Possible StringData Ref from Data Obj ->"CDROM:>Ultim@te Race Pro>Ultim@te "
  231.                                         ->"Race Pro.exe"
  232.                                   |
  233. :00493BC3 B960565300              mov ecx, 00535660
  234. :00493BC8 E883790300              call 004CB550
  235. :00493BCD 85C0                    test eax, eax
  236. :00493BCF 7525                    jne 00493BF6
  237.  
  238. * Possible StringData Ref from Data Obj ->"CDROM2:>Ultim@te Race Pro>Ultim@te "
  239.                                         ->"Race Pro.exe"
  240.                                   |
  241. :00493BD1 B990565300              mov ecx, 00535690
  242. :00493BD6 E875790300              call 004CB550
  243. :00493BDB 85C0                    test eax, eax
  244. :00493BDD 7517                    jne 00493BF6
  245.  
  246. * Possible StringData Ref from Data Obj ->"CDROM3:>Ultim@te Race Pro>Ultim@te "
  247.                                         ->"Race Pro.exe"
  248.                                   |
  249. :00493BDF B9C0565300              mov ecx, 005356C0
  250. :00493BE4 E867790300              call 004CB550
  251. :00493BE9 85C0                    test eax, eax
  252. :00493BEB 7509                    jne 00493BF6
  253. :00493BED 8BCE                    mov ecx, esi
  254. :00493BEF E8EC010000              call 00493DE0
  255. :00493BF4 EBCD                    jmp 00493BC3
  256.  
  257. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  258. |:00493BCF(C), :00493BDD(C), :00493BEB(C)
  259. |
  260. :00493BF6 5E                      pop esi
  261. :00493BF7 C3                      ret
  262.  
  263.     Okay, so this routine seems to use some type of call interpeter, where the CDROM-CDROM3 are for
  264. the different types of install options, ie: small, medium and full.  So I decided to go back on step more
  265. and check out the two routines that called this new code above.
  266.  
  267.  
  268.   -- Program Code --
  269.  
  270. :00493C55 B964575300              mov ecx, 00535764
  271. :00493C5A E861F30000              call 004A2FC0
  272. :00493C5F 85C0                    test eax, eax
  273. :00493C61 7407                    je 00493C6A     <-- This conditional jump will be useful
  274. :00493C63 8BCD                    mov ecx, ebp
  275. :00493C65 E856FFFFFF              call 00493BC0   <-- Call the CD check routine
  276.  
  277. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  278. |:00493C61(C)
  279. |
  280. :00493C6A 8BFD                    mov edi, ebp
  281. :00493C6C 83C9FF                  or ecx, FFFFFFFF
  282. :00493C6F 33C0                    xor eax, eax
  283.  
  284.   -- Continuing Program Code --
  285.  
  286.     No secondary flags or results checked after the call to the CD check routine.  But wait!, look
  287. at the conditional jump (je or Jump Equal) at 493C61.  If taken, it'll jump over the CD check and 
  288. continue the game, which is what we want.  So our edit here will be changing the conditional jump to a
  289. non conditional jump.  Then this CD check is bypassed!  Now lets check the second call out:
  290.  
  291.   -- Program Code --
  292.  
  293. :00493CA0 8B442414                mov eax, dword ptr [esp+14]
  294. :00493CA4 85C0                    test eax, eax
  295. :00493CA6 7415                    je 00493CBD
  296.  
  297. * Possible StringData Ref from Data Obj ->"CD_NEEDED"
  298.                                   |
  299. :00493CA8 B964575300              mov ecx, 00535764
  300. :00493CAD E80EF30000              call 004A2FC0
  301. :00493CB2 85C0                    test eax, eax
  302. :00493CB4 7407                    je 00493CBD     <-- Again, a useful conditional jump
  303. :00493CB6 8BCD                    mov ecx, ebp
  304. :00493CB8 E803FFFFFF              call 00493BC0   <-- Second call to the CD check routine
  305.  
  306. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  307. |:00493CA6(C), :00493CB4(C)
  308. |
  309.  
  310. * Possible StringData Ref from Data Obj ->"CDROM:>Ultim@te Race Pro>"
  311.                                   |
  312. :00493CBD BFF0565300              mov edi, 005356F0
  313. :00493CC2 83C9FF                  or ecx, FFFFFFFF
  314. :00493CC5 33C0                    xor eax, eax
  315.  
  316.   -- Continuing Program Code --
  317.  
  318.     Basicly that same as the first call to the CD check and we'll make the same type of edit here as
  319. well.  I made the edit and ran URP to see the effect, it came right up and I raced around for a bit.  So
  320. the only thing left to do is apply the actual edit.  Make the same edit at BOTH locations:
  321.  
  322. Edit Ultim@te Race Pro at BOTH
  323. offsets of 602,209 AND 602,292
  324. ==============================
  325. Search for: 85 C0 74 07 8B CD
  326. Change to : -- -- EB -- -- --
  327.  
  328. Edit Ultim@te Race Pro v1.03 beta at BOTH
  329. offsets of 607,023 AND 607,106
  330. ==============================
  331. Search for: 85 C0 74 07 8B CD
  332. Change to : -- -- EB -- -- --
  333.  
  334. Edit Ultim@te Race Pro v1.40
  335. at offset of 618,878
  336. ==============================
  337. Search for: E8 4D FF FF FF
  338. Change to : B8 01 00 00 00
  339.  
  340. Edit Ultim@te Race Pro v1.50
  341. at offset of 602,958
  342. ==============================
  343. Search for: E8 4D FF FF FF
  344. Change to : B8 01 00 00 00
  345.  
  346. For the Creative Labs Voodoo2 bundled version of Ultim@te Race Pro:
  347.  
  348. Edit Ultim@te Race Pro at BOTH
  349. offsets of 602,751 AND 602,834
  350. ==============================
  351. Search for: 85 C0 74 07 8B CD
  352. Change to : -- -- EB -- -- --
  353.  
  354.  
  355.     Ultim@te Race Pro is now FiX'ed and can be run completly from your hard drive without the need for
  356. the original CD to be in your CD-ROM drive.  For future versions, try searching for "85 C0 74 07 8B CD" and
  357. change the "74" to "EB", you should find two occurrances close together.  That should help you out with other
  358. versions that may come out.
  359.  
  360. Static Vengeance
  361.